<?php
/**
 * Created by PhpStorm.
 * User: yuanxr
 * Date: 2018/6/10
 * Time: 上午8:33
 */

namespace Utility\IO;
use Utility\Gen;
use \Exception;
/**********************************************************************************************************************
 * 实用IO功能
 * 1、file：与文件、目录相关的方法
 **********************************************************************************************************************/
/**********************************************************************************************************************
 * /file：与文件、目录相关的操作
 **********************************************************************************************************************/
class File
{
    private $_Gen;
    public function __construct()
    {
        $this->_Gen = new Gen();
    }
    /**
     * mkdir
     *
     * @param string $dir 需要创建的目录名称
     * @return void 如果目录不存在，则创建（迭代创建）
     */
    public function mkdir(string $dir)
    {
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
        }
    }

    /**
     * newdir
     *
     * @return string 返回以Y-m-d为格式的日期字符串目录名
     */
    public function newdir()
    {
        return date('Y-m-d');
    }

    /**
     * newname
     *
     * @return string 返回以13位时间 + 随机4位字符串命名的文件名字符串
     */
    public function newname()
    {
        return $this->_Gen->time13() . $this->_Gen->char();
    }

    /**
     * getdir
     *
     * @param string $path 需要获取目录字符串的文件地址
     * @return string 该文件的目录字符串
     */
    public function getdir(string $path)
    {
        return pathinfo($path)['dirname'];
    }

    /**
     * getfilename
     *
     * @param string $path 需要获取文件名称的文件地址
     * @return string 该文件的文件名（包含扩展名）
     */
    public function getfilename(string $path)
    {
        return pathinfo($path)['basename'];
    }

    /**
     * getext
     *
     * @param string $path 需要获取文件扩展名的文件地址
     * @return string 文件的扩展名
     */
    public function getext(string $path)
    {
        return pathinfo($path)['extension'];
    }

    /**
     * readArray
     *
     * @param string $path 需要读取的文件地址
     * @return array 读取文件，并返回数组（每一行为数组的一个元素）
     */
    public function readArray(string $path)
    {

        // 判断文件是否存在
        if (!is_file($path)) {
            try{
                throw new Exception('需要读取的文件不存在！');
            }catch(Exception $e){
                echo $e->getMessage();exit();
            }
        }

        // 读取
        $data = [];
        $file = fopen($path, 'r');
        while (!feof($file)) {
            $data[] = fgets($file);
        }
        fclose($file);

        // 返回数据
        return $data;
    }

    /**
     * write
     *
     * @param string $path 需要写入文件的路径
     * @param string $content 需要写入的内容
     * @return void 无返回，将文本内容写入文件
     *
     * 注意：
     * 以方法会清空以前的文件内容
     */
    public function write(string $path, string $content)
    {
        $this->_write($path, $content, false);
    }

    /**
     * append
     *
     * @param string $path 需要写入文件的路径
     * @param string $content 需要写入的内容
     * @return void 无返回，将文本内容追加到文件
     *
     * 注意：
     * 以方法会在以前文件内容的基础上进行追加写入
     */
    public function append(string $path, string $content)
    {
        $this->_write($path, $content, true);
    }

    /**
     * _write
     */
    private function _write(string $path, string $content, bool $append)
    {

        // 定义mode（写入模式）
        $mode = $append ? 'a' : 'w';

        // 写入文件
        $file = fopen($path, $mode);
        fwrite($file, $content);
        fclose($file);
    }
}
